Skip to main content

🔗 Bağlı Liste (Linked List) Uzunluğu Nasıl Bulunur?

Bu Rehberde Ne Öğreneceksiniz?

Bu rehberde, bağlı liste (Linked List) veri yapısının uzunluğunu bulmanın iki temel yöntemini öğreneceksiniz:
1️⃣ Yinelemeli (Iterative) yöntem — döngüyle sayma,
2️⃣ Özyinelemeli (Recursive) yöntem — fonksiyon çağrısıyla sayma.

Her iki yaklaşımı da hem C hem Java dillerinde pratik kod örnekleriyle adım adım inceleyeceğiz.


🧠 1. Bağlı Liste Nedir?

Bağlı liste, verileri doğrusal şekilde saklayan dinamik bir veri yapısıdır.
Her eleman bir düğüm (Node) olarak adlandırılır ve iki ana bölümden oluşur:

  • Veri (Data): Değerin kendisini içerir.
  • İşaretçi (Next): Sonraki düğümün adresini gösterir.

Listenin sonundaki düğümün next değeri daima NULL olur.

📘 Özet:
Bağlı liste = “veri + sonraki düğüm adresi” kombinasyonuna sahip zincir yapısıdır.


⚙️ 2. Bağlı Liste Uzunluğunu Bulma Yöntemleri

Bir bağlı listedeki toplam düğüm sayısını (uzunluğunu) bulmak için iki yöntem kullanılır:

YöntemAçıklama
Yinelemeli (Iterative)Döngü kullanarak düğümleri tek tek gezip sayar.
Özyinelemeli (Recursive)Fonksiyonun kendisini çağırmasıyla her düğümü sayar.

🔢 3. Yinelemeli (Iterative) Yaklaşım

Bu yöntem, listenin başından başlayarak her düğümü gezer ve sayaç artırarak toplam uzunluğu döndürür.

📋 Adımlar:

  1. count değişkenini 0 olarak başlat.
  2. temp işaretçisini head’e ata.
  3. temp != NULL oldukça:
    • count++ yap.
    • temp = temp.next ile sonraki düğüme geç.
  4. Döngü bittiğinde count değeri listenin uzunluğudur.

☕ Java Kod Örneği

public int length() {
Node temp = this.head;
int count = 0;
while (temp != null) {
count++;
temp = temp.next;
}
return count;
}

🧩 Bu metot, bağlı listedeki her düğümü tek tek sayarak toplam uzunluğu döndürür.

💻 C Kod Örneği


int getLength(struct node *head) {
int length = 0;
while (head != NULL) {
head = head->next; // Sonraki düğüme ilerle
length++; // Sayaç artır
}
return length;
}

🧠 Bu fonksiyon, her düğümü ziyaret ederek toplam düğüm sayısını hesaplar.


🔁 4. Özyinelemeli (Recursive) Yaklaşım

Özyineleme (recursion), bir fonksiyonun kendini çağırarak sorunu daha küçük alt parçalara bölmesidir. Bu yöntem, kodun daha kısa ve anlaşılır olmasını sağlar.

📘 Mantık: Temel Durum (Base Case): Düğüm NULL olduğunda 0 döndür.

Özyinelemeli Durum: 1 + getCount(next_node) formülüyle ilerle.

☕ Java Kod Örneği


public int lengthUsingRecursiveApproach() {
return lengthUsingRecursiveApproach(this.head);
}

private int lengthUsingRecursiveApproach(Node curr) {
if (curr == null)
return 0;
return 1 + lengthUsingRecursiveApproach(curr.next);
}

🧩 Her düğümde 1 eklenir ve fonksiyon kendini çağırarak liste sonuna ulaşır.

💻 C Kod Örneği


int getCount(struct Node* head) {
if (head == NULL)
return 0;
return 1 + getCount(head->next);
}

📘 Her fonksiyon çağrısı bir düğüm sayar, sonunda toplam uzunluk elde edilir.


🧮 5. Zaman Karmaşıklığı ve Performans

Her iki yöntem de listenin tüm düğümlerini bir kez ziyaret eder. Bu nedenle zaman karmaşıklığı aynıdır:

YaklaşımZaman KarmaşıklığıEkstra Bellek Kullanımı
Yinelemeli (Iterative)O(N)O(1)
Özyinelemeli (Recursive)O(N)O(N) (fonksiyon çağrı yığını için)

🧠 N = listedeki düğüm sayısıdır.


❓ 6. Sıkça Sorulan Sorular (SSS)

1. Yinelemeli ve Özyinelemeli farkı nedir?

Yinelemeli yöntem daha az bellek kullanır ve genellikle daha hızlıdır. Özyinelemeli yöntem ise kodun daha okunabilir olmasını sağlar.

2. Head işaretçisini neden değiştirmemeliyiz?

Head, listenin başlangıç noktasını gösterir. Değiştirirseniz, tüm listeye erişimi kaybedersiniz. Bu nedenle daima geçici bir işaretçiyle gezinilmelidir.

3. Java’da this.size değişkeni varsa neden sayıyoruz?

Bazı sınıflar uzunluğu zaten saklar. Bu rehberde algoritmik olarak düğüm sayımı anlatılmıştır.

4. Zaman karmaşıklığı neden O(N)?

Her düğüm yalnızca bir kez ziyaret edilir, bu nedenle işlem süresi eleman sayısıyla orantılıdır.

5. Çok uzun listelerde recursive yöntem neden riskli olabilir?

Çünkü her çağrı için stack belleği kullanılır; bu da stack overflow hatasına neden olabilir.


🏁 Sonuç

Bağlı liste uzunluğunu bulmak, veri yapısı mantığını kavramak için mükemmel bir örnektir. Her iki yöntemi de anlamak, hem algoritmik düşünme becerinizi hem de bellek yönetimi farkındalığınızı artırır.

💡 Bu algoritmaları Rabisu Bulut platformunda test ederek performans farklarını gözlemleyebilir ve kod optimizasyonlarını deneyimleyebilirsiniz.